// 一个函数如果加上 async，那么该函数就会返回一个 Promise

async function test() {
    return '1'
}
console.log(test()); // Promise {<resolved>: 1}

// async 就是将函数返回值使用 Promise.res() 包裹了下，和 then 中处理返回值一样，并且 await 只能匹配 async 使用
async function test () {
    let value = await sleep()
}

// async 和 await 可以说是异步终极解决方案了，相比直接使用 Promise 来说，优势在于处理 then 的调用链，能够更清晰准确的写出了代码，毕竟写一大堆 then 也很恶心，并且也能优雅地解决回调地狱问题。
// 缺点：await 将异步代码改造成了同步代码，如果多个异步代码没有依赖性却使用了 await 会导致性能上的降低。

async function test () {
    // 以下代码没有依赖性的话，完全可以使用 Promise.all 的方式
    // 如果有依赖性的话，其实就是解决回调地狱的例子
    await fetch(url)
    await fetch(url1)
    await fetch(url2)
}

let a = 0
let b = async () => {
    a = a + await 10
    console.log('2', a); // 2 10
}
b()
a++
console.log('1', a); // 1 1

// 首先函数 b 先执行，在执行到 await 10 之前变量 a 还是0，因为 await 内部实现了 generator，generator 会保留堆栈中东西，所以这时候 a = 0 被保存下来
// 因为 await 是异步操作，后来的表达式不返回 Promise 的话，就会包装成 Promise.resolve(返回值)，然后会去执行函数外的同步代码
// 同步代码执行完毕后开始执行异步代码，将保存下来的值拿出来用，这时候 a = 0 + 10

// 其实 await 就是 generator 加 Promise 的语法糖，且内部实现了自动执行 generator。

